package my.learnDB.mybatis.service;

import my.learnDB.mybatis.daoXML.AccountDao;
import my.learnDB.mybatis.domain.Account;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

/**
 * 不使用Dao接口
 * 1、自配置文件
 * 2、测试：加载配置文件，生成动态对象，执行SQL
 */
public class AAService {

    static SqlSession sqlSession = null;

    /**
     * 静态方法：提供 sqlSession, 需要sqlMapConfig.xml。
     * 和spring整合的时候，把sqlSessionFac放入bean，注入sqlMapConfig.xml就行了。
     */
    static {
        //加载核心配置文件
        String resource = "sqlMapConfigAnno.xml";

        InputStream in = null;
        try {
            in = Resources.getResourceAsStream(resource);
        } catch (IOException e) {
            throw new RuntimeException("mybatis加载主配置异常：" + e.getMessage());
        }

        //创建SqlSessionFactory
        SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
        SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(in);

        sqlSession = sqlSessionFactory.openSession(true);  // 自动提交
        // sqlSession = sqlSessionFactory.openSession();
    }


    public static void main(String[] args) {

        // 无论使用哪种方式 sqlMapConfig.xml主配置文件肯定不能少
        // onlyMapperXML();
        onlyDaoInterface();
    }

    /**
     * 只有sqlMapConfig.xml 和 mappers.xml
     * 开发中不使用
     */
    private static void onlyMapperXML() {
        Account account = sqlSession.selectOne("mapperXMLWithoutDao.findAccountById", 1);

        System.out.println("withoutDao：" + account);

        List<Account> accounts = sqlSession.selectList("mapperXMLWithoutDao.findAccountsLikeUserName", "小");
        System.out.println(accounts);

        sqlSession.commit();
        sqlSession.close();
    }

    /**
     * Dao接口 + sqlMapConfigAnno.xml + mappers.xml
     * 开发经常使用的方式
     */
    private static void onlyDaoInterface() {

        // 工厂已经根据配置文件 xxMapper.xml 生成了动态的代理对象
        // 获取代理对象
        AccountDao AccountDao = sqlSession.getMapper(AccountDao.class);

        Account account = AccountDao.findById(2);

        // List<Account> accounts = AccountDao.("小");

        System.out.println(account);
        System.out.println("****************");
        // System.out.println(accounts);


        // saveAccount，获取id
        Account accountWithId = new Account("小果5",1,  5000f);
        // int i = AccountDao.saveAccount(accountWithId);
        System.out.println("最新的id: " + accountWithId.getId());

        // sqlSession.commit();
        sqlSession.close();
    }

    /**
     * Dao接口 + DaoImpl + sqlMapConfigAnno.xml
     * 开发中不使用
     */
    private static void daoAndDaoImpl() {
        // 把sqlSession放到Dao的实现类中
        // 无意义略过
    }
}
